wayland: Factor out frame timings request code
authorBenjamin Otte <otte@redhat.com>
Tue, 10 Apr 2018 13:10:56 +0000 (15:10 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 10 Apr 2018 13:13:38 +0000 (15:13 +0200)
Also call the code everywhere we draw and not just with Cairo.

gdk/wayland/gdkglcontext-wayland.c
gdk/wayland/gdkprivate-wayland.h
gdk/wayland/gdksurface-wayland.c
gdk/wayland/gdkvulkancontext-wayland.c

index 3db9db5ac491cf0bb6e47b88e71c53c0e69ae787..03fcea28435c7584500d9f051df2fcd5c96ee15a 100644 (file)
@@ -224,6 +224,7 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context,
                                                     context_wayland->egl_config);
 
   gdk_wayland_surface_sync (surface);
+  gdk_wayland_surface_request_frame (surface);
 
   if (display_wayland->have_egl_swap_buffers_with_damage && damage != NULL)
     {
index 4df2f33ffd842ce68f2218ea9a83dc146be05752..8de1b6383192a0cca163f9193591243376dd1c3e 100644 (file)
@@ -89,6 +89,7 @@ guint      _gdk_wayland_cursor_get_next_image_index (GdkWaylandDisplay *display,
                                                      guint             *next_image_delay);
 
 void       gdk_wayland_surface_sync (GdkSurface *surface);
+void       gdk_wayland_surface_request_frame (GdkSurface *surface);
 
 void            _gdk_wayland_surface_register_dnd          (GdkSurface *surface);
 GdkDragContext *_gdk_wayland_surface_drag_begin            (GdkSurface *surface,
index d771fd1857d0e4a408b8f7325238cd47a855354d..cfa8319178469d5a77c8bbb41b1c7b7b2764137d 100644 (file)
@@ -513,12 +513,30 @@ on_frame_clock_before_paint (GdkFrameClock *clock,
     }
 }
 
+void
+gdk_wayland_surface_request_frame (GdkSurface *surface)
+{
+  GdkSurfaceImplWayland *impl = GDK_SURFACE_IMPL_WAYLAND (surface->impl);
+  struct wl_callback *callback;
+  GdkFrameClock *clock;
+
+  if (impl->awaiting_frame)
+    return;
+
+  clock = gdk_surface_get_frame_clock (surface);
+
+  callback = wl_surface_frame (impl->display_server.wl_surface);
+  wl_callback_add_listener (callback, &frame_listener, surface);
+  _gdk_frame_clock_freeze (clock);
+  impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
+  impl->awaiting_frame = TRUE;
+}
+
 static void
 on_frame_clock_after_paint (GdkFrameClock *clock,
                             GdkSurface     *surface)
 {
   GdkSurfaceImplWayland *impl = GDK_SURFACE_IMPL_WAYLAND (surface->impl);
-  struct wl_callback *callback;
 
   if (!impl->pending_commit)
     return;
@@ -526,9 +544,7 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
   if (surface->update_freeze_count > 0)
     return;
 
-  callback = wl_surface_frame (impl->display_server.wl_surface);
-  wl_callback_add_listener (callback, &frame_listener, surface);
-  _gdk_frame_clock_freeze (clock);
+  gdk_wayland_surface_request_frame (surface);
 
   /* Before we commit a new buffer, make sure we've backfilled
    * undrawn parts from any old committed buffer
@@ -551,8 +567,6 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
 
   impl->pending_buffer_attached = FALSE;
   impl->pending_commit = FALSE;
-  impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
-  impl->awaiting_frame = TRUE;
 
   g_signal_emit (impl, signals[COMMITTED], 0);
 }
index b5e82139f5bb91ed5ce34436af71a55bc097e379..714ae6de4b260492e98c144ef088e67e8a5261aa 100644 (file)
@@ -67,6 +67,7 @@ gdk_vulkan_context_wayland_end_frame (GdkDrawContext *context,
   GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (context));
 
   gdk_wayland_surface_sync (surface);
+  gdk_wayland_surface_request_frame (surface);
 
   GDK_DRAW_CONTEXT_CLASS (gdk_wayland_vulkan_context_parent_class)->end_frame (context, painted, damage);
 }